package cn.kent.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 使用了一个纯Java语言的内置服务器
 * Spring Boot为它提供了自动配置
 * ldapAuthentication()方法使得登录表单中用户名会插入到的uid={0},ou=people,dc=springframework,dc=org的“{0}”中
 * passwordCompare()方法配置了密码编码器和密码属性
 * LDAP服务器可以使用LDIF（LDAP数据交换格式）文件来交换用户数据。 -- LDIF文件并不是一个生产环境的标准配置。但是对于测试来说更有用。
 *
 * @author kent
 * @date 2021/5/27 15:58
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

//    @Override
//    protected void configure(HttpSecurity httpSecurity) throws Exception {
//        httpSecurity
//                .authorizeRequests()
//                .anyRequest()
//                .fullyAuthenticated()
//                .and()
//                .formLogin();
//    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                .url("ldap://localhost:8389/dc=springframework,dc=org")
                .and()
                .passwordCompare()
                .passwordEncoder(new BCryptPasswordEncoder())
                .passwordAttribute("userPassword");
    }


//    @Autowired
//    DataSource dataSource;
//    /**
//     * 基于JDBC的用户存储
//     * 以下代码只重写了认证和基本权限的查询语句，
//     *      通过调用groupAuthoritiesByUsername()方法，也能够将群组权限重写为自定义的查询语句
//     * 通过指定
//     */
//    @Override
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        auth.jdbcAuthentication()
//                .dataSource(dataSource)
//                .usersByUsernameQuery(
//                        "select username, password , enabled from Users " +
//                                "where username=?")
//                .authoritiesByUsernameQuery(
//                        "select username, authority from UserAuthorities " +
//                                "where username=?")
//                .passwordEncoder(new StandardPasswordEncoder("53cr3t"));
//    }

//    /**
//     * 基于内存的用户存储
//     */
//        @Override
//        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        auth.inMemoryAuthentication()
//                .passwordEncoder(new BCryptPasswordEncoder())
//                    .withUser("buzz")
//                    .password(new BCryptPasswordEncoder().encode("infinity"))
//                    .authorities("ROLE_USER")
//                .and()
//                    .withUser("woody")
//                    .password("bullseye")
//                    .authorities("ROLE_USER");
//    }


}
